package org.jeecg.modules.sms.util;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.net.ConnectException;
import java.net.URL;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.*;

public class CommonUtil {



    /**
     * 作者： liwei
     * 时间：2018年1月2日
     * 描述：六位随机不重复数
     *
     * @return
     */
    public static String randomSixNum() {
        StringBuilder str = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 6; i++) {
            str.append(random.nextInt(10));
        }
        return str.toString();
    }


    public static String createOrderNo() {
        Date date=new Date();
        DateFormat format = new SimpleDateFormat("yyyyMMdd");
        String time = format.format(date);
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if (hashCodeV < 0) {//有可能是负数
            hashCodeV = -hashCodeV;
        }
        // 0 代表前面补充0
        // 4 代表长度为4
        // d 代表参数为正数型
        return time + String.format("%011d", hashCodeV);
    }




    /**
     * 获取指定月数后的日期
     * @return
     */
    public static Date getDateByMonth(Date old,Integer add){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(old);
        calendar.add(Calendar.MONTH,add);
        return calendar.getTime();
    }


    /**
     * 判断日期先后
     * @param DATE1
     * @param DATE2
     */
    public static int compare_date(Date DATE1, Date DATE2) {

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        try {
            if (DATE1.getTime() >= DATE2.getTime()) {
                System.out.println("dt1 在dt2后");
                return 1;
            } else if (DATE1.getTime() < DATE2.getTime()) {
                System.out.println("dt1在dt2前");
                return 2;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取当前时间字符串
     * @return
     */
    public static String getCurrentDate(){
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = new Date();
        String format = df.format(date);
        return format;
    }

    /**
     * 获取当前年份
     */
    public static  String getCurrentYear(){
        DateFormat df = new SimpleDateFormat("yyyy");
        Date date = new Date();
        String format = df.format(date);
        return format;
    }

    /**
     * @param pObj :
     * @return boolean true:为空
     * @throws :
     * @Description(功能描述) : 是否为空
     */
    @SuppressWarnings("rawtypes")
    public static boolean isEmpty(Object pObj) {
        if (pObj == null) {
            return true;
        }
        if ("".equals(pObj)) {
            return true;
        }
        if ("null".equals(pObj)) {
            return true;
        }
        if (pObj instanceof String) {
            if (((String) pObj).length() == 0) {
                return true;
            }
        } else if (pObj instanceof Collection) {
            if (((Collection) pObj).size() == 0) {
                return true;
            }
        } else if (pObj instanceof Map) {
            if (((Map) pObj).size() == 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * @param pObj ：
     * @return boolean
     * @throws :
     * @Description(功能描述) : 是否不为空
     */
    @SuppressWarnings("rawtypes")
    public static boolean isNotEmpty(Object pObj) {
        if (pObj == null) {
            return false;
        }
        if ("".equals(pObj)) {
            return false;
        }
        if ("null".equals(pObj)) {
            return false;
        }
        if (pObj instanceof Boolean && pObj==null) {
            return false;
        }
        if (pObj instanceof String) {
            if (((String) pObj).length() == 0) {
                return false;
            }

        } else if (pObj instanceof Collection) {
            if (((Collection) pObj).size() == 0) {
                return false;
            }
        } else if (pObj instanceof Map) {
            if (((Map) pObj).size() == 0) {
                return false;
            }
        }
        return true;
    }


    /**
     * @param ：
     * @return boolean
     * @throws :
     * @Description(功能描述) : 是否不为空
     */
    @SuppressWarnings("rawtypes")
    public static boolean isNotEmptys(Object... objs) {
        for (Object obj : objs) {
            if (obj == null) {
                return false;
            }
            if ("".equals(obj)) {
                return false;
            }
            if (obj instanceof String) {
                if (((String) obj).length() == 0) {
                    return false;
                }
            } else if (obj instanceof Collection) {
                if (((Collection) obj).size() == 0) {
                    return false;
                }
            } else if (obj instanceof Map) {
                if (((Map) obj).size() == 0) {
                    return false;
                }
            }
        }
        return true;
    }




    /**
     * @param bean   原数据
     * @param result 转换结果
     * @throws :
     * @Description(功能描述) : javaBean 转 map
     */
    public static void bean2Map(Object bean, Map<String, Object> result) {
        Method[] methods = bean.getClass().getDeclaredMethods();
        try {
            for (Method method : methods) {
                if (method.getName().startsWith("get")) {
                    String field = method.getName();
                    field = field.substring(field.indexOf("get") + 3);
                    field = field.toLowerCase().charAt(0) + field.substring(1);
                    Object value = method.invoke(bean, (Object[]) null);
                    result.put(field, null == value ? "" : value);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param bean   原数据
     * @param result 转换结果
     * @throws :
     * @Description(功能描述) : javaBean 转 map
     */
    public static void bean2MapNotEmpty(Object bean, Map<String, Object> result) {
        Method[] methods = bean.getClass().getDeclaredMethods();
        try {
            for (Method method : methods) {
                if (method.getName().startsWith("get")) {
                    String field = method.getName();
                    field = field.substring(field.indexOf("get") + 3);
                    field = field.toLowerCase().charAt(0) + field.substring(1);
                    Object value = method.invoke(bean, (Object[]) null);
                    if (isNotEmpty(value)) {
                        result.put(field, null == value ? "" : value);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param source 原对象
     * @param result 转换结果
     * @throws :
     * @Description(功能描述) : javaBean 转 javaBean
     */
    public static void bean2Bean(Object source, Object result) {
        Method[] smethods = source.getClass().getDeclaredMethods();
        Method[] dmethods = result.getClass().getDeclaredMethods();
        try {
            for (Method smethod : smethods) {
                if (smethod.getName().startsWith("get")) {
                    String sfield = smethod.getName();
                    sfield = sfield.substring(sfield.indexOf("get") + 3);
                    sfield = sfield.toLowerCase().charAt(0) + sfield.substring(1);
                    Object value = smethod.invoke(source, (Object[]) null);
                    if (!CommonUtil.isEmpty(value)) {
                        for (Method dmethod : dmethods) {
                            if (dmethod.getName().startsWith("set")) {
                                String dfield = dmethod.getName();
                                dfield = dfield.substring(dfield.indexOf("set") + 3);
                                dfield = dfield.toLowerCase().charAt(0) + dfield.substring(1);
                                if (dfield.equals(sfield)) {
                                    dmethod.invoke(result, new Object[]{value});
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 方法描述:将class2中的属性值赋值给class1，如果class1属性有值，则不覆盖   前提条件是有相同的属性名
     *
     * @param :(参数及说明)class1:被赋值对象 class2:数据的对象
     * @param class1
     * @param class2
     * @return ：(返回值说明)No return value
     * @exception:(异常说明)exceptions No exceptions thrown
     */
//    public static void copyBean(Object class1, Object class2) {
//        try {
//            Class<?> clazz1 = class1.getClass();
//            Class<?> clazz2 = class2.getClass();
//            // 得到method方法
//            Method[] method1 = clazz1.getMethods();
//            Method[] method2 = clazz2.getMethods();
//
//            int length1 = method1.length;
//            int length2 = method2.length;
//            if (length1 != 0 && length2 != 0) {
//                // 创建一个get方法数组，专门存放class2的get方法。
//                Method[] get = new Method[length2];
//                for (int i = 0, j = 0; i < length2; i++) {
//                    if (method2[i].getName().indexOf("get") == 0) {
//                        get[j] = method2[i];
//                        ++j;
//                    }
//                }
//
//                for (int i = 0; i < get.length; i++) {
//                    if (get[i] == null)// 数组初始化的长度多于get方法，所以数组后面的部分是null
//                        continue;
//                    // 得到get方法的值，判断时候为null，如果为null则进行下一个循环
//                    Object value = get[i].invoke(class2, new Object[]{});
//                    if (null == value)
//                        continue;
//                    // 得到get方法的名称 例如：getXxxx
//                    String getName = get[i].getName();
//                    // 得到set方法的时候传入的参数类型，就是get方法的返回类型
//                    Class<?> paramType = get[i].getReturnType();
//                    Method getMethod = null;
//                    try {
//                        // 判断在class1中时候有class2中的get方法，如果没有则抛异常继续循环
//                        getMethod = clazz1.getMethod(getName, new Class[]{});
//                    } catch (NoSuchMethodException e) {
//                        continue;
//                    }
//                    // class1的get方法不为空并且class1中get方法得到的值为空，进行赋值，如果class1属性原来有值，则跳过
//                    if (null == getMethod || null != getMethod.invoke(class1, new Object[]{}))
//                        continue;
//                    // 通过getName 例如getXxxx 截取后得到Xxxx，然后在前面加上set，就组装成set的方法名
//                    String setName = "set" + getName.substring(3);
//                    // 得到class1的set方法，并调用
//                    Method setMethod = clazz1.getMethod(setName, paramType);
//                    setMethod.invoke(class1, value);
//                }
//            }
//        } catch (Exception e) {
//            System.out.println(e);
//        }
//    }

    /**
     * @param map    原对象
     * @param result 转换结果
     * @throws :
     * @Description(功能描述) : map 转换成 bean
     */
    public static void map2Bean(Map<String, Object> map, Object result) {
        Method[] methods = result.getClass().getDeclaredMethods();
        for (Method method : methods) {
            try {
                if (method.getName().startsWith("set")) {
                    String field = method.getName();
                    field = field.substring(field.indexOf("set") + 3);
                    field = field.toLowerCase().charAt(0) + field.substring(1);
                    method.invoke(result, new Object[]{map.get(field)});
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @return String
     * @throws :
     * @Description(功能描述) : 生成5位随机字符
     */
    public static String grow5num() {
        StringBuffer sb = new StringBuffer();
        String a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        char[] rands = new char[5];
        for (int i = 0; i < rands.length; i++) {
            int rand = (int) (Math.random() * a.length());
            rands[i] = a.charAt(rand);
        }
        for (int i = 0; i < rands.length; i++) {
            sb.append(rands[i]);
        }
        return sb.toString();
    }

    /**
     * 计算百分比
     */
    public static String getPercent(Integer count,Integer total){
        NumberFormat nf = NumberFormat.getPercentInstance();
        nf.setMinimumFractionDigits(0); // 设置两位小数位
        double result = (double) count / total;
        return nf.format(result);
    }

    /**
     * 获取当前年份及之前6年年份
     */
    public static List<Integer> getSixYear(){
        List<Integer> list = new ArrayList<>();
        SimpleDateFormat format = new SimpleDateFormat("yyyy");
        String format1 = format.format(new Date());
        Integer year = Integer.parseInt(format1);
        list.add(year-6);
        list.add(year-5);
        list.add(year-4);
        list.add(year-3);
        list.add(year-2);
        list.add(year-1);
        list.add(year);




        return list;
    }

    public static List<String> getSixMonth() {
        List<String> list = new ArrayList<>();
        for (int i=7;i>0;i--){
            String last12Months = getLast12Months(i);
            list.add(last12Months);
        }
        return list;
    }

    public static  String getLast12Months(int i) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.MONTH, -i);
        Date m = c.getTime();
        String s = sdf.format(m);
        return s.substring(s.length()-2);

    }

    public static  String getLast12Month(int i) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.MONTH, -i);
        Date m = c.getTime();
        String s = sdf.format(m);
        return s;

    }

    public static String getTwo(String a,int b){

        int i = a.indexOf(".");
        String substring = a.substring(0, i);
        DecimalFormat df = new DecimalFormat("0.00");
        int c = Integer.parseInt(substring);
        float d = (float)c/b;
        String format = df.format(d);
        return format;
    }

    public static void main(String[] args){
        System.out.println(getPercent(1233,2344));
    }

}
